#include<iostream>
#include<string>
#include<unistd.h>
#include<pthread.h>

std::string Formatid(const pthread_t &tid)//为了兼容cout打印
{
    char id[64];
    snprintf(id,sizeof(id),"0x%lx",tid);
    return id;
}
void showtid(pthread_t &tid)//打印线程ID
{
    printf("tid:0x%lx\n",tid);
}


void* routine(void* args)//子线程执行的方法
{
    std::string name = static_cast<const char*>(args);//强制类型转换的类
    pthread_t tid = pthread_self();//拿到自己的线程ID
    int cnt = 5;
    while(cnt--)
    {
        std::cout << "我是一个新进程 " << "我的ID是: " << Formatid(tid) << std::endl;
        sleep(1);
    }
    showtid(tid);
    return (void*) 10;
}


int main()//主线程执行的逻辑
{
    pthread_t tid;
    int n = pthread_create(&tid,nullptr,routine,(void*) "thread -1");
    if(n != 0)
    {
        std::cout << "pthread_create error: " << n << std::endl;
        exit(1); 
    }
    showtid(tid);//以地址的形式打印tid值
    int cnt = 5;
    while(cnt--)
    {
        std::cout << "我是main线程 " << "我的ID是: " << Formatid(pthread_self()) << std::endl;//获得线程的线程ID
        sleep(1); 
    }
    void* ret = nullptr;//用来存储线程的返回值
    pthread_join(tid,&ret);//通过进程的线程ID来等待进程,不等待进程可能会有内存泄露的风险.
    std::cout << "ret is: " << (long long int)ret << std::endl;
    return 0;
}

//该进程像我们展示了我们用户拿到的不是LWP而是线程用户级的线程ID(库中内存结构的首地址),LWP是在内核中调度使用,线程退出主线程要等待
//cpu通过不同的LWP来区分线程